// 引入必要的命名空间
using Microsoft.AspNetCore.Authorization; // 提供授权相关的功能
using Microsoft.AspNetCore.Mvc; // 提供MVC控制器和ActionResult支持
using UniversalAdmin.Application.DTOs; // 引入数据传输对象定义
using UniversalAdmin.Application.Services; // 引入服务层接口和实现

// 定义控制器的命名空间
namespace UniversalAdmin.Api.Controllers;

// 标记该类为API控制器
[ApiController]
// 定义路由模板，v1表示API版本，[controller]会自动替换为控制器名称
[Route("api/v1/[controller]")]
// 标记该控制器需要授权访问（开发环境下暂时禁用）
// [Authorize]
// 继承自ControllerBase，提供基础的控制器功能
public class ArticleCategoryController : ControllerBase
{
    // 注入文章分类服务接口
    private readonly IArticleCategoryService _categoryService;

    // 构造函数，依赖注入IArticleCategoryService
    public ArticleCategoryController(IArticleCategoryService categoryService)
    {
        _categoryService = categoryService;
    }

    // HTTP GET方法，获取所有文章分类
    [HttpGet]
    public async Task<IActionResult> GetAllCategories()
    {
        // 调用服务层获取所有分类
        var categories = await _categoryService.GetAllCategoriesAsync();
        // 返回200 OK响应，包含分类列表
        return Ok(categories);
    }

    // HTTP GET方法，获取分类树结构
    [HttpGet("tree")]
    public async Task<IActionResult> GetCategoryTree()
    {
        // 调用服务层获取分类树
        var categoryTree = await _categoryService.GetCategoryTreeAsync();
        // 返回200 OK响应，包含分类树
        return Ok(categoryTree);
    }

    // HTTP GET方法，根据ID获取单个分类
    [HttpGet("{id}")]
    public async Task<IActionResult> GetCategoryById(Guid id)
    {
        // 调用服务层根据ID获取分类
        var category = await _categoryService.GetCategoryByIdAsync(id);
        // 如果分类不存在，返回404 Not Found响应
        if (category == null)
            return NotFound(new { message = "分类不存在" });
        // 返回200 OK响应，包含分类信息
        return Ok(category);
    }

    // HTTP POST方法，创建新分类
    [HttpPost]
    public async Task<IActionResult> CreateCategory([FromBody] CreateArticleCategoryDto dto)
    {
        try
        {
            // 调用服务层创建分类
            var category = await _categoryService.CreateCategoryAsync(dto);
            // 返回201 Created响应，包含新分类的URI和分类信息
            return CreatedAtAction(nameof(GetCategoryById), new { id = category.Id }, category);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP PUT方法，更新分类
    [HttpPut("{id}")]
    public async Task<IActionResult> UpdateCategory(Guid id, [FromBody] UpdateArticleCategoryDto dto)
    {
        try
        {
            // 调用服务层更新分类
            var category = await _categoryService.UpdateCategoryAsync(id, dto);
            // 如果分类不存在，返回404 Not Found响应
            if (category == null)
                return NotFound(new { message = "分类不存在" });
            // 返回200 OK响应，包含更新后的分类信息
            return Ok(category);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP DELETE方法，删除分类
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteCategory(Guid id)
    {
        try
        {
            // 调用服务层删除分类
            var success = await _categoryService.DeleteCategoryAsync(id);
            // 如果分类不存在，返回404 Not Found响应
            if (!success)
                return NotFound(new { message = "分类不存在" });
            // 返回204 No Content响应，表示删除成功
            return NoContent();
        }
        catch (InvalidOperationException ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }
}